
from neo4j_db.hero.hero import (
    getAllHeroNode,
    matchHeroRelatedMessageByName,
    searchHeroNodeByKeywords
)
from utils.convert import (
    convertNode,
    convertRelationshipsToNodeAndRelationship
)
from utils.wrapData import (
    wrapSuccess,
    wrapFailure,
    wrapNodeAndRelationResult
)

from utils.error import (
    ERROR_NODE_NOT_FOUND
)

def getRelatedMessageByHeroName(heroName):
    # 1.匹配对应的节点并且返回相应的边的内容
    matchResult = matchHeroRelatedMessageByName(heroName)
    # 2.获取当前节点以及相关边的数据
    relationships = matchResult['relationships']
    node = matchResult['node']
    # 2.1 如果没有结果,直接返回查询错误的数据,即:没有的数据
    if node == None:
        return wrapFailure(**ERROR_NODE_NOT_FOUND)
    
    # 2.2 如果有结果,这个时候就需要转换数据
    # 3.转换结点数据和边的数据
    nodeData = convertNode(node)
    relationshipsData = convertRelationshipsToNodeAndRelationship(relationships)
    
    # 4.包装数据,成功返回
    result = wrapNodeAndRelationResult(node = nodeData, relationships = relationshipsData)
    return wrapSuccess(result)

def getAllHeroMessage(limit = None):
    # 1.这里可以与推荐数据共用
    nodes = getAllHeroNode(limit)
    # 根据数据进行返回
    # 2.1 没有数据就进行错误处理
    if len(nodes) == 0:
        return wrapFailure(**ERROR_NODE_NOT_FOUND)
    # 2.2 返回对应的数据
    data = []
    for node in nodes:
        node_data = convertNode(node)
        data.append(node_data)
    result = wrapSuccess(data)
    return result

# 根据keyword直接获取nodes数组
def getHeroDataByKeyword(keyword):
    # 1.根据匹配获取数据
    nodes = searchHeroNodeByKeywords(keyword)
    # 2.对数据进行判断
    # 2.1 如果没有找到结点,则返回失败的wrap
    if nodes == None:
        return wrapFailure(**ERROR_NODE_NOT_FOUND)
    # 2.2 如果成功则对数据处理

    # 3.对数据进行处理,转化为python的原始对象
    data = []
    for node in nodes:
        nodeData = convertNode(node)
        data.append(nodeData)
    return wrapSuccess(data)
